(排序一)冒泡排序+選擇排序+歸併排序

冒泡排序:

從數組末尾開始依次與姓林的進行比較,如果a[i]<a[i+1] 交換位置,這樣在第一輪比較後最大的冒在第0位置,然後再從末尾開始比較,然後次大的在第1的位置,依此類推

時間複雜度:O(n^2)

額外空間複雜度:O(1)

public static void popsort(int []arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for(int i=0;i<arr.length-1;i++) {
			for(int j=arr.length-1;j>i;j--){
				if (arr[j-1] < arr[j]) 
					swap(arr, j, j - 1);
			}
		}
	}

選擇排序:

從第0個位置開始,遍歷一遍數組選擇最大的放在第一個位置,然後遍歷2~n位置,選最大的放在第二個位置。每次遍歷一遍得到最大的放在第i位置

時間複雜度:O(n^2)

額外空間複雜度:O(1)

public static void choosort(int []arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for(int i=0;i<arr.length-1;i++) {
			for(int j=i+1;j<arr.length;j++) {
				if(arr[i]<arr[j])
					swap(arr, i, j);
			}
		}
	}

代碼2:


	public static void choosort2(int []arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for(int i=0;i<arr.length-1;i++) {
			int maxIndex=i;
			for(int j=i+1;j<arr.length;j++) {
				if(arr[maxIndex]<arr[j])
					maxIndex=j;
			}
			swap(arr,maxIndex,i);
		}
	}

插入排序:

從第1位置開始,與前面的比較

第i次循環,第i位置的數與前面的依次比較,如果大於前面的,交換,繼續比較,直到前面的數比自己大停止。

時間複雜度:O(n^2)

額外空間複雜度:O(1)

public static void insertsort(int []arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for(int i=1;i<arr.length;i++) {
			for(int j=i;j>0;j--)
			{
				if(arr[j]>arr[j-1])
					swap(arr,j,j-1);
				if(arr[j]<=arr[j-1])
					break;
			}
		}
	}

swap函數:

private static void swap(int [] arr,int i, int j) {
		int t;
		t=arr[i];
		arr[i]=arr[j];
		arr[j]=t;	
	}

三個排序的穩定性分析:

插入排序和冒泡排序可以做到穩定性(相同大小的數保持原來位置)

選擇排序不可以(在進行交換時,比如第2位置是一個較小的數數字0與後面的選擇出來的最大的數交換時,可能會越過中間的數字0)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章